/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladores;

import compra.CadastroCompra;
import compra.Compra;
import compra.RepositorioCompra;
import java.sql.Date;
import java.util.List;
import solicitacaoCompra.CadastroSolicitacaoCompra;
import solicitacaoCompra.RepositorioSolicitacaoCompra;
import solicitacaoCompra.SolicitacaoCompra;
import util.CamposObrigatoriosException;
import util.ErroAcessoRepositorioException;
import util.Util;

/**
 *
 * @author Alberto
 */
public class ControladorCompra {
    private RepositorioCompra objRepositorioCompra;
    private RepositorioSolicitacaoCompra objRepositorioSolicitacaoCompra = null;

    public ControladorCompra(RepositorioCompra objRepositorioCompra) {
        this.objRepositorioCompra = objRepositorioCompra;
    }
    
    public ControladorCompra(RepositorioCompra objRepositorioCompra, RepositorioSolicitacaoCompra objRepositorioSolicitacaoCompra) {
        this.objRepositorioCompra = objRepositorioCompra;
        this.objRepositorioSolicitacaoCompra = objRepositorioSolicitacaoCompra;
    }
    
    /**
     * Método que ira cadastrar a Compra na base
     * 
     * @param objCompra
     * @throws ErroAcessoRepositorioException 
     */
    public void cadastrar(Compra objCompra) throws ErroAcessoRepositorioException, CamposObrigatoriosException {
        CadastroCompra objCadastroCompra = new CadastroCompra(this.objRepositorioCompra);
        CadastroSolicitacaoCompra objCadastroSolicitacaoCompra = new CadastroSolicitacaoCompra(this.objRepositorioSolicitacaoCompra);
        
        // Validações
        if(objCompra.getQtdProduto() == 0) throw new CamposObrigatoriosException("Qtd Produto");
        if(objCompra.getValorCompra() == 0) throw new CamposObrigatoriosException("Valor Compra");
        // Setando o status da solicitação compra para comprado
        objCompra.getSolicitacaoCompra().setFlagComprado(true);
        
        objCadastroCompra.cadastrarAtualizar(objCompra);
        
    }
    
    /**
     * Método que ira cadastrar a Compra na base
     * 
     * @param objCompra
     * @throws ErroAcessoRepositorioException 
     */
    public void atualizar(Compra objCompra) throws ErroAcessoRepositorioException, CamposObrigatoriosException {
        CadastroCompra objCadastroCompra = new CadastroCompra(this.objRepositorioCompra);
        
        // Validações
        if(objCompra.getIdCompra() == 0) throw new CamposObrigatoriosException("Identificador Produto");
        if(objCompra.getQtdProduto() == 0) throw new CamposObrigatoriosException("Qtd Produto");
        if(objCompra.getValorCompra() == 0) throw new CamposObrigatoriosException("Valor Compra");
        
        objCadastroCompra.cadastrarAtualizar(objCompra);
    }
    
    /**
     * Método que ira procurar uma determinada Compra na base
     * @param idCompra
     * @return Compra
     * @throws ErroAcessoRepositorioException 
     */
    public Compra procurar(int idCompra) throws ErroAcessoRepositorioException, CamposObrigatoriosException {
        CadastroCompra objCadastroCompra = new CadastroCompra(this.objRepositorioCompra);
        
        // Validações
        if(idCompra == 0) throw new CamposObrigatoriosException("Identificador Produto");
        
        return objCadastroCompra.procurar(idCompra);
    }
    
    /**
     * Método que ira verificar a existencia de uma Compra na base
     * 
     * @param idCompra
     * @return boolean
     * @throws ErroAcessoRepositorioException 
     */
    public boolean existe(int idCompra) throws ErroAcessoRepositorioException, CamposObrigatoriosException{
        CadastroCompra objCadastroCompra = new CadastroCompra(this.objRepositorioCompra);
        
        // Validações
        if(idCompra == 0) throw new CamposObrigatoriosException("Identificador Produto");
        
        return objCadastroCompra.existe(idCompra);
    }
    
    /**
     * Método que ira listar as Compra da base
     * 
     * @param strComplemento
     * @return List<Compra> 
     * @throws ErroAcessoRepositorioException 
     */
    public List<Compra> listar(String strComplemento) throws ErroAcessoRepositorioException {
        CadastroCompra objCadastroCompra = new CadastroCompra(this.objRepositorioCompra);
        
        return objCadastroCompra.listar(strComplemento);
    }
    
    /**
     * Método que ira remover as Compras da base
     * 
     * @param idCompra
     * @throws Exception 
     */
    public void remover(int idCompra) throws Exception, CamposObrigatoriosException {
        CadastroCompra objCadastroCompra = new CadastroCompra(this.objRepositorioCompra);
        
        // Validações
        if(idCompra == 0) throw new CamposObrigatoriosException("Identificador Produto");
        
        objCadastroCompra.remover(idCompra);
    }
    
    public List<Compra> listarCompraPorFornecedorPorSolicitacaoPorFuncionarioPorData(int idFornecedor, int idSolicitacaoCompra, int idFuncionario, Date dataSolicitacaoInicial, Date dataSolicitacaoFinal)  throws ErroAcessoRepositorioException, Exception {
        CadastroCompra objCadastroCompra = new CadastroCompra(this.objRepositorioCompra);
        
        if(idFornecedor == 0 && idSolicitacaoCompra == 0 && idFuncionario == 0
        && dataSolicitacaoInicial.toString().trim().length() == 0) throw new Exception("Favor selecionar um dos campos do filtro!");
        
        if(dataSolicitacaoInicial.toString().trim().length() == 0)
            dataSolicitacaoInicial = Date.valueOf("2001-01-01");
        
        if(dataSolicitacaoFinal.toString().trim().length() == 0)
            dataSolicitacaoFinal = Date.valueOf(Util.getDataAtual());
            
        return objCadastroCompra.listarCompraPorFornecedorPorSolicitacaoPorFuncionarioPorData(idFornecedor, idSolicitacaoCompra, idFuncionario, dataSolicitacaoInicial, dataSolicitacaoFinal);
    }
    
    /**
     * Método que ira listar as Compra da base
     * 
     * @param strComplemento
     * @return List<Compra> 
     * @throws ErroAcessoRepositorioException 
     */
    public List<Compra> listarAtivas() throws ErroAcessoRepositorioException {
        CadastroCompra objCadastroCompra = new CadastroCompra(this.objRepositorioCompra);
        
        return objCadastroCompra.listarAtivas();
    }
    
    /**
     * Método que ira listar as Compra da base
     * 
     * @param strComplemento
     * @return List<Compra> 
     * @throws ErroAcessoRepositorioException 
     */
    public List<Compra> listarAtivasENaoRecebidas() throws ErroAcessoRepositorioException {
        CadastroCompra objCadastroCompra = new CadastroCompra(this.objRepositorioCompra);
        
        return objCadastroCompra.listarAtivasENaoRecebidas();
    }
}